package com.example.xunai.service.user;

import com.example.xunai.dto.response.system.TokenUsageResponse;
import com.example.xunai.dto.response.user.TokenStatsResponse;
import com.example.xunai.entity.TokenUsage;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * Token使用服务接口
 */
public interface TokenUsageService {

    /**
     * 记录token使用情况
     */
    void recordTokenUsage(Long userId, Long conversationId, Long messageId, String model,
                          Integer inputTokens, Integer outputTokens);

    /**
     * 记录token使用情况（不包含messageId）
     */
    void recordTokenUsage(Long userId, Long conversationId, String model,
                          Integer inputTokens, Integer outputTokens);

    /**
     * 获取用户token使用统计
     */
    TokenUsageResponse getUserTokenUsage(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取用户token统计摘要
     */
    TokenStatsResponse getUserTokenStatsSummary(Long userId, int days);

    /**
     * 获取用户按模型统计的token使用量
     */
    List<Map<String, Object>> getUserTokenStats(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取用户token使用汇总统计
     */
    Map<String, Object> getUserTokenSummary(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取用户每日token使用趋势
     */
    List<Map<String, Object>> getUserDailyTokenTrend(Long userId, int days);

    /**
     * 获取模型使用统计
     */
    List<Map<String, Object>> getModelUsageStats(LocalDate startDate, LocalDate endDate);

    /**
     * 获取系统总体token使用统计
     */
    Map<String, Object> getSystemTokenSummary(LocalDate startDate, LocalDate endDate);

    /**
     * 获取用户最近使用的模型列表
     */
    List<String> getUserRecentModels(Long userId, int limit);

    /**
     * 获取对话的token使用详情
     */
    List<TokenUsage> getConversationTokenUsage(Long conversationId);

    /**
     * 获取用户在某时间段的token使用总量
     */
    Map<String, Integer> getUserTotalTokenUsage(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取用户的所有token使用记录
     */
    List<TokenUsage> getUserTokenUsageRecords(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 检查用户是否超过token限制
     */
    boolean isUserExceededTokenLimit(Long userId, LocalDate startDate, LocalDate endDate, int limit);
}